#include "myStack.h"

// 初始化栈
void initStack(Stack* stack) {
    stack->top = -1;  // 栈顶指针初始化为-1，表示栈为空
}

// 检查栈是否为空
bool isEmpty(Stack* stack) {
    return stack->top == -1;
}

// 检查栈是否已满
bool isFull(Stack* stack) {
    return stack->top == MAX_SIZE - 1;
}

// 入栈操作
int push(Stack* stack, int* value) {
    if (isFull(stack)) {
        DEBUG("Stack overflow! Cannot push element.\n");
        return -1;
    }
    stack->data[++stack->top] = value;  // 栈顶指针加1，然后将元素放入栈顶
    return 0;
}

// 出栈操作
int* pop(Stack* stack) {
    if (isEmpty(stack)) {
        // DEBUG("Stack underflow! Cannot pop from an empty stack.\n");
        return NULL;  // 返回空指针表示错误
    }
    return stack->data[stack->top--];  // 返回栈顶元素，然后栈顶指针减1
}

// 查看栈顶元素
int* peek(Stack* stack) {
    if (isEmpty(stack)) {
        DEBUG("Stack is empty! No element to peek.\n");
        return NULL;  // 返回空指针表示错误
    }
    return stack->data[stack->top];  // 返回栈顶元素
}

// 销毁栈（释放所有动态分配的内存）
void destroyStack(Stack* stack) {
    while (!isEmpty(stack)) {
        int* element = pop(stack);  // 弹出栈顶元素
        free(element);               // 释放动态分配的内存
    }
}

// 打印栈中的元素
void printStack(Stack* stack) {
    int i, j;

    if (isEmpty(stack)) {
        DEBUG("Stack is empty!\n");
        return;
    }
    DEBUG("Stack elements (FILO order):\n");
    for (i = stack->top; i >= 0; i--) {
        DEBUG("Element at index %d: ", i);
        int* array = stack->data[i];
        // 假设数组以-1结尾（作为哨兵值）
        for (j = 0; array[j] != -1; j++) {
            DEBUG("%d ", array[j]);
        }
        DEBUG("\n");
    }
}

// int main() {
//     Stack stack;
//     initStack(&stack);

//     // 测试栈的操作
//     int* array1 = malloc(4 * sizeof(int));
//     array1[0] = 1;
//     array1[1] = 2;
//     array1[2] = 3;
//     array1[3] = -1;  // 哨兵值，表示数组结束
//     push(&stack, array1);

//     int* array2 = malloc(3 * sizeof(int));
//     array2[0] = 4;
//     array2[1] = 5;
//     array2[2] = -1;  // 哨兵值，表示数组结束
//     push(&stack, array2);

//     int* array3 = malloc(2 * sizeof(int));
//     array3[0] = 6;
//     array3[1] = -1;  // 哨兵值，表示数组结束
//     push(&stack, array3);

//     printStack(&stack);  // 打印栈中的元素

//     // 弹出栈顶元素并释放内存
//     int* poppedArray = pop(&stack);
//     DEBUG("Popped element: ");
//     for (int i = 0; poppedArray[i] != -1; i++) {
//         DEBUG("%d ", poppedArray[i]);
//     }
//     DEBUG("\n");
//     free(poppedArray);  // 释放动态分配的内存

//     printStack(&stack);  // 打印剩余的元素

//     // 销毁栈并释放所有内存
//     destroyStack(&stack);

//     return 0;
// }